package cn.lovexiaov.javafx.view;

import cn.lovexiaov.javafx.model.Person;
import cn.lovexiaov.javafx.util.DateUtil;
import javafx.fxml.FXML;
import javafx.scene.control.Alert;
import javafx.scene.control.TextField;
import javafx.stage.Stage;

/**
 * Dialog to edit details of a person.
 *
 * @author Marco Jakob
 */
public class PersonEditDialogController {

  @FXML
  private TextField firstNameField;
  @FXML
  private TextField lastNameField;
  @FXML
  private TextField streetField;
  @FXML
  private TextField postalCodeField;
  @FXML
  private TextField cityField;
  @FXML
  private TextField birthdayField;

  private Stage dialogStage;
  private Person person;
  private boolean okClicked = false;

  /**
   * Initializes the controller class. This method is automatically called
   * after the fxml file has been loaded.
   */
  @FXML
  private void initialize() {
  }

  /**
   * Sets the stage of this dialog.
   */
  public void setDialogStage(Stage dialogStage) {
    this.dialogStage = dialogStage;
  }

  /**
   * Sets the person to be edited in the dialog.
   */
  public void setPerson(Person person) {
    this.person = person;

    firstNameField.setText(person.getFirstName());
    lastNameField.setText(person.getLastName());
    streetField.setText(person.getStreet());
    postalCodeField.setText(Integer.toString(person.getPostalCode()));
    cityField.setText(person.getCity());
    birthdayField.setText(DateUtil.format(person.getBirthday()));
    birthdayField.setPromptText("dd.mm.yyyy");
  }

  /**
   * Returns true if the user clicked OK, false otherwise.
   */
  public boolean isOkClicked() {
    return okClicked;
  }

  /**
   * Called when the user clicks ok.
   */
  @FXML
  private void handleOk() {
    if (isInputValid()) {
      person.setFirstName(firstNameField.getText());
      person.setLastName(lastNameField.getText());
      person.setStreet(streetField.getText());
      person.setPostalCode(Integer.parseInt(postalCodeField.getText()));
      person.setCity(cityField.getText());
      person.setBirthday(DateUtil.parse(birthdayField.getText()));

      okClicked = true;
      dialogStage.close();
    }
  }

  /**
   * Called when the user clicks cancel.
   */
  @FXML
  private void handleCancel() {
    dialogStage.close();
  }

  /**
   * Validates the user input in the text fields.
   *
   * @return true if the input is valid
   */
  private boolean isInputValid() {
    String errorMessage = "";

    if (firstNameField.getText() == null || firstNameField.getText().length() == 0) {
      errorMessage += "No valid first name!\n";
    }
    if (lastNameField.getText() == null || lastNameField.getText().length() == 0) {
      errorMessage += "No valid last name!\n";
    }
    if (streetField.getText() == null || streetField.getText().length() == 0) {
      errorMessage += "No valid street!\n";
    }

    if (postalCodeField.getText() == null || postalCodeField.getText().length() == 0) {
      errorMessage += "No valid postal code!\n";
    } else {
      // try to parse the postal code into an int.
      try {
        Integer.parseInt(postalCodeField.getText());
      } catch (NumberFormatException e) {
        errorMessage += "No valid postal code (must be an integer)!\n";
      }
    }

    if (cityField.getText() == null || cityField.getText().length() == 0) {
      errorMessage += "No valid city!\n";
    }

    if (birthdayField.getText() == null || birthdayField.getText().length() == 0) {
      errorMessage += "No valid birthday!\n";
    } else {
      if (!DateUtil.validDate(birthdayField.getText())) {
        errorMessage += "No valid birthday. Use the format dd.mm.yyyy!\n";
      }
    }

    if (errorMessage.length() == 0) {
      return true;
    } else {
      // Show the error message.
      Alert alert = new Alert(Alert.AlertType.ERROR);
      alert.setTitle("Invalid Fields");
      alert.setHeaderText("Please correct invalid fields");
      alert.setContentText(errorMessage);
      alert.showAndWait();

      return false;
    }
  }
}